package cn.javasm.aspect;

import cn.javasm.demo.TestDemo;
import cn.javasm.enums.PrivEnum;
import cn.javasm.privanno.PrivAnno;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @version: 0.1
 */
@Component
@Aspect //切面类
public class PrivAspect {

    @Around("execution(* cn.javasm.service..*.*(..))")
    public Object privAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 获取接口的方法
        MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
        Method method = signature.getMethod();
        // 获取目标对象
        Object target = proceedingJoinPoint.getTarget();
        // 获取目标对象的方法
        Method instanceMethod = target.getClass().getMethod(method.getName(), method.getParameterTypes());
        // 判断目标方法上面是否有PrivAnno这个注解
        if (instanceMethod.isAnnotationPresent(PrivAnno.class)){
            //   如果有
            //          获取注解的值
            PrivAnno annotation = instanceMethod.getAnnotation(PrivAnno.class);
            PrivEnum[] value = annotation.value();
            //          判断注解中的值是否包含用户的角色
            if (Arrays.asList(value).contains(TestDemo.role)){
                //              如果包含，直接放行
                return proceedingJoinPoint.proceed();
            }else {
                //              如果不包含，抛出异常
                throw new RuntimeException("权限不足");
            }
        }else {
            //   如果没有，直接放行
            return proceedingJoinPoint.proceed();
        }
    }
}
